#include "bsp_led.h"

#define BSP_LED_LOG "[bsp_led]"

static pin_t g_led_pin[LED_MAX_NUM] = {0}; // LED pin

/**
 * @brief  初始化LED设备。
 * @param  [in] led_id 需要初始化的led设备id号，注意"LED_ALL"不可用， 参考 @ref led_id_t 。
 * @param  [in] pin led设备使用的GPIO引脚， 参考 @ref pin_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_led_init(led_id_t led_id, pin_t pin)
{
    // 检查参数
    if (led_id >= LED_MAX_NUM)
    {
        osal_printk("%s Invalid Error\n", BSP_LED_LOG);
        return ERRCODE_INVALID_PARAM;
    }

    // 保存引脚
    g_led_pin[led_id] = pin;

    // 设置引脚模式
    errcode_t ret = ERRCODE_SUCC;
    if (g_led_pin[led_id] == GPIO_04)
    {
        ret = uapi_pin_set_mode(g_led_pin[led_id], PIN_MODE_2);
    }
    else if (g_led_pin[led_id] == GPIO_05)
    {
        ret = uapi_pin_set_mode(g_led_pin[led_id], PIN_MODE_4);
    }
    else
    {
        ret = uapi_pin_set_mode(g_led_pin[led_id], PIN_MODE_0);
    }
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set led[%d] pin mode failed, ret = %d\n", BSP_LED_LOG, led_id + 1, ret);
        return ret;
    }

    // 设置引脚方向
    ret = uapi_gpio_set_dir(g_led_pin[led_id], GPIO_DIRECTION_OUTPUT);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set led[%d] pin direction failed, ret = %d\n", BSP_LED_LOG, led_id + 1, ret);
        return ret;
    }

    // 设置引脚值
    ret = uapi_gpio_set_val(g_led_pin[led_id], GPIO_LEVEL_LOW);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set led[%d] pin value failed, ret = %d\n", BSP_LED_LOG, led_id + 1, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}

/**
 * @brief  设置LED状态。
 * @param  [in] led_id 需要初始化的led设备id号， 参考 @ref led_id_t 。
 * @param  [in] state led设备需要设置的状态， 参考 @ref led_state_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_led_set_state(led_id_t led_id, led_state_t state)
{
    if(led_id > LED_MAX_NUM)
    {
        osal_printk("%s Invalid Error\n", BSP_LED_LOG);
        return ERRCODE_INVALID_PARAM;
    }

    errcode_t ret;

    // 设置引脚电平 所有引脚
    if(led_id == LED_MAX_NUM)
    {
        for(uint8_t i = 0; i < LED_MAX_NUM; i++)
        {
            ret = uapi_gpio_set_val(g_led_pin[i], state);
            if (ret != ERRCODE_SUCC)
            {
                osal_printk("%s: set led[%d] pin mode failed, ret = %d\n", BSP_LED_LOG, i + 1, ret);
                return ret;
            }
        }

        return ERRCODE_SUCC;
    }

    // 设置引脚电平 单个引脚
    ret = uapi_gpio_set_val(g_led_pin[led_id], state);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set led[%d] pin mode failed, ret = %d\n", BSP_LED_LOG, led_id + 1, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}

/**
 * @brief  翻转LED状态。
 * @param  [in] led_id 需要初始化的led设备id号， 参考 @ref led_id_t 。
 * @retval ERRCODE_SUCC 成功。
 * @retval Other        失败，参考 @ref errcode_t 。
 */
errcode_t bsp_led_toggle(led_id_t led_id)
{
    if(led_id > LED_MAX_NUM)
    {
        osal_printk("%s Invalid Error\n", BSP_LED_LOG);
        return ERRCODE_INVALID_PARAM;
    }

    errcode_t ret;

    // 翻转引脚电平 所有引脚
    if(led_id == LED_MAX_NUM)
    {
        for(uint8_t i = 0; i < LED_MAX_NUM; i++)
        {
            ret = uapi_gpio_toggle(g_led_pin[i]);
            if (ret != ERRCODE_SUCC)
            {
                osal_printk("%s: set led[%d] pin mode failed, ret = %d\n", BSP_LED_LOG, i + 1, ret);
                return ret;
            }
        }

        return ERRCODE_SUCC;
    }

    // 翻转引脚电平 单个引脚
    ret = uapi_gpio_toggle(g_led_pin[led_id]);
    if (ret != ERRCODE_SUCC)
    {
        osal_printk("%s: set led[%d] pin mode failed, ret = %d\n", BSP_LED_LOG, led_id + 1, ret);
        return ret;
    }

    return ERRCODE_SUCC;
}
